module.exports = (options) => {
    // Koa 中间件的本质：一个 async function
    return async function(ctx, next) {
        // 如果在白名单内的请求，我们直接放行
        if (options.whiteList.includes(ctx.path)) {
            await next();
            // 否则，就需要验证登录
        } else {
            // 从请求 header 中获取 token
            const token = ctx.headers.token;
            // 判断有没有携带 token
            if (!token) {
                ctx.body = {
                    code: 401,
                    message: 'token 不存在',
                };
                return;
            }
            // 校验 token 是不是服务器签发
            try {
                // 解析 token 中的用户信息
                const user = ctx.helper.checkToken(token);
                // console.log('user', user);
                // 添加到 ctx 对象，就是为了在 controller、service 中使用
                ctx.user = user;
                // 向下执行
                await next();
            } catch (error) {
                // token 过期，提示前台重新登录
                if (error.name === 'TokenExpiredError') {
                    ctx.body = {
                        code: 401,
                        message: 'token 过期，请重新登录',
                    };
                    return;
                }
                // 如果是 token 的其他错误，我们直接返回 token 不合法
                if (error.name === 'JsonWebTokenError') {
                    ctx.body = {
                        code: 401,
                        message: 'token 无效',
                    };
                    return;
                }
                console.log('token 解析失败', error.message);
            }
        }
    };
};
